package com.cskaoyan.javase.homework.day22;

/**
 * @description:
 * @author: songtao@cskaoyan.onaliyun.com
 **/

/*
## 启动3个线程打印递增的数字使用wait notifyAll (选做)

 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10,
 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推,
 直到打印到75

 线程1 --> 1
 线程2 --> 6
 线程3 --> 11
 线程1 --> 16
 线程2 --> 21
 线程3 --> 26
 ...

 三个线程，轮流打印
 每次都只能同时执行一个线程，肯定要加锁
 -->
 根据一个算法来判断打印的数值,判断这个数值包括这个数值接下来的5个数
 是哪个线程打印
 -->
 如果是某个线程打印,那就打印,并且打印完了之后,要唤醒其它人(要唤醒所有人,notifyAll)
 如果不是某个线程打印,那应该wait自己阻止自己打印


3 = 11 / 5 % 3 + 1

 */
public class Work2 {
    public static void main(String[] args) {
        // 启动3个线程
        new Thread(new PrintRunnable(1), "a").start();
        new Thread(new PrintRunnable(2), "b").start();
        new Thread(new PrintRunnable(3), "c").start();
    }
}

class PrintRunnable implements Runnable {
    private static int printNum = 0;
    private int threadId;

    public PrintRunnable(int threadId) {
        this.threadId = threadId;
    }

    @Override
    public void run() {
        while (printNum < 75) {
            // 同步代码块
            synchronized (PrintRunnable.class) {
                // 核心就是让这个值等于线程id
                if (printNum / 5 % 3 + 1 == threadId) {
                    // 打印5个数
                    for (int i = 0; i < 5; i++) {
                        System.out.println(Thread.currentThread().getName() +
                                "线程: " + ++printNum);
                    }
                    System.out.println("----------");
                    // notifyAll
                    PrintRunnable.class.notifyAll();
                } else {
                    // wait
                    try {
                        PrintRunnable.class.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

